跳到主要内容

API

运动器可以让弹道或拥有运动能力的生物按照一定的规则进行持续移动。

令单位unit向其面朝方向运动1000距离:

skill:mover_line
{
source = unit,
mover = target,
angle = target:get_facing(),
distance = 1000,
speed = 1000,
}

发射一个追踪弹道追踪unit

skill:mover_target
{
source = unit,
model = '弹道单位名称',
target = unit,
speed = 1000,
}

运动分为直线运动与追踪运动2种。直线运动会使单位沿着固定直线轨迹移动;而追踪运动则需要设置一个单位作为追踪目标,使单位不停的靠近目标。

  • 一个单位同一时间只能进行一个运动,当单位已有运动却获得新的运动时,将根据优先级决定哪个运动有效:若新的运动优先级大于等于当前运动的优先级,则移除当前运动获得新的运动;否则新的运动添加失败。
  • 单位可以同时进行运动与移动,不过目前客户端对这种情况的表现不正确。
  • 若单位处于跟随状态,则无法添加运动。
  • 通过passive可以设定是否是主动运动:主动运动会使运动单位的朝向始终朝向运动方向,且当运动单位拥有定身行为限制时将无法进行主动运动。
  • 之前animation_point可以修正运动起点,让弹道看起来是从“武器”或“手部”发射,而不是从身体中央发射。现在该字段已废弃,远程普攻会从SpellData表里的projectile_point字段进行修正,一般技能和mover暂时不支持。
  • 运动可能会创建失败,你需要判空后再使用它。

创建

mover_line

直线运动

  • 参数
    • data (table) - 运动属性
  • 返回
    • mover (mover) - 运动对象
local mover = skill:mover_line
{
source = unit,
mover = unit,
}

mover_target

追踪运动

  • 参数
    • data (table) - 运动属性
  • 返回
    • mover (mover) - 运动对象
local mover = skill:mover_target
{
source = unit,
mover = unit,
target = unit,
}

属性

运动的属性需要在创建时作为参数传入。

source

运动来源(unit)

skill

关联技能(skill)

会被设置为创建时使用的技能对象,不需要再次设置。

target

目标(point/unit)

如果是追踪运动,那么这个值的类型必须是(unit)。如果是直线运动,那么这是个可选参数,会在angledistance中用到这个值。

mover

运动单位(unit)

进行运动的单位。movermodel这2个参数需要设置其一,运动才能创建成功。

model

单位名(string)

创建一个临时单位作为运动单位,当运动结束后该单位会被移除。movermodel这2个参数需要设置其一,运动才能创建成功。

start

起点(point)

如果不填,则使用mover的位置或source的位置作为起点。

angle

方向(number)

运动的初始方向,若不填则为运动单位到target的方向。

distance

距离(number)

直线运动的运动距离。

max_distance

最大距离(number)

追踪运动的最大距离。默认为运动单位到target距离的2倍。

speed

速度(number)

accel

加速度(number)

min_speed

速度下限(number)

一般配合加速度使用,使运动速度不会小于该值。默认为0.0。

max_speed

速度上线(number)

一般配合加速度使用,使运动速度不会大于该值。

height

起点高度(number)

默认为0。

target_height

终点高度(number) 离地面

force_height

终点高度(number) 离z=0平面

直线运动的默认值为height追踪运动的默认值为target受击高度

parabola_height

抛物线高度(number)

抛物线的顶点高度,默认为0。

turn_speed

转身速度(number)

追踪运动每秒改变朝向的速度限制。不填表示无限制。

hit_type

碰撞类型(string)

设置此值后,运动单位与附近单位碰撞时将触发on_hit事件。敌我判断的参考单位为正在运动的单位。不会碰撞到运动单位自己。可以是以下值:

  • 敌方 碰撞敌方单位
  • 友方 碰撞友方单位
  • 全部 碰撞所有单位

hit_area

碰撞范围(number)

add_impact_area

附加轰击范围(number)

默认值为0。设置其它值将会影响轰击目标时的验证半径。最终验证半径由目标单位碰撞半径[CollisionRadius]、投射物碰撞范围[hit_area]及投射物附加轰击范围[add_impact_area]之和决定。

hit_same

碰撞同一个单位(boolean)

默认为false

hit_target

碰撞追踪目标(boolean)

对于追踪运动,当为true时,运动单位与target的距离小于[hit_area]时运动完成;当为false时,运动单位需要到达target的位置时运动完成。默认为true

block

碰撞地形(boolean)

当为true时,当运动单位到达静态碰撞时会触发on_block事件。若没有注册此事件,则会移除运动。

priority

优先级(number)

passive

被动运动(boolean)

默认为false

animation_point

已经废弃 动画点 可以是以下的值:

  • 字符串skill:若[skill]使用set_animation设置过动画,则会从动画表中找到该动画的ProjectilePoint,使用这个值来修正起点。
  • {x, y, z}:使用指定的坐标修正起点。

pathing_bit_prevent & pathing_bit_requird

分别是mover不能通过的碰撞类型和mover需要的碰撞类型(通行标记), 这两个字段同时生效所以这两个表不能有交集 标记可以为

Unwalkable, 不可行走。 Unflyable,不可飞行。 Unbuildable, 不可建造。 UnPeonHarvest,不可采集区域(用于war3兼容的保留bit,无需实现) Blighted,荒芜地(用于war3兼容的保留bit) Unfloatable,不可漂浮(指船只不可抵达的地方,即陆地等并非水域的地方。) Unamphibious,不可两栖(水路两栖生物无法抵达的地方,即路障,或者没有水和陆地的无底陷坑。) UnItemplacable,不可放置物品。 Cliff, Higher,指存在高于地表的障碍物 Lower,指存在低于地表的障碍物(像是刷出来的沟壑) PathingBit13,以下为保留bit,备不时之需。 PathingBit14, PathingBit15, PathingBit16,

local mover = skill:mover_line
{
source = unit,
model = '马甲单位',
start = start,
target = target,
speed = 100,
block = true,
pathing_bit_prevent = {'Unflyable'},
pathing_bit_required = {'UnItemplacable'}
}

表示mover只能通过带有UnItemplacable且没有Unflyable的格子 目前编辑器默认刷出来和生成的碰撞带有的标记说明 https://confluence.xindong.com/pages/viewpage.action?pageId=115773247

事件

on_block

碰撞地形事件

  • 事件返回
    • remove (boolean) - 是否移除运动

只有当block设置为true时才可能触发此事件。在事件中返回true可以移除运动。

function mover:on_block()
return true
end

on_finish

完成事件

直线运动distance跑完,或是追踪运动追上target后触发。比on_remove先触发。

function mover:on_finish()
-- 你的代码
end

on_hit

碰撞单位事件

  • 事件参数
    • unit (unit) - 碰撞到的单位
  • 回调返回
    • remove (boolean) - 是否移除运动

只有设置了hit_type后才可能触发此事件。在事件中返回true可以移除运动。

function mover:on_hit(unit)
return true
end

on_remove

移除事件

运动被移除时触发此事件。

function mover:on_remove()
-- 你的代码
end

方法

batch_update

批量更新

立即更新运动,直到运动完成。

利用直线运动来“探路”:

local mover = skill:mover_line
{
source = unit,
model = '马甲单位',
start = start,
target = target,
speed = 100,
block = true,
}

if mover then
function mover:on_block()
-- start与target的之间有静态碰撞
end

mover:batch_update()
end

remove

移除运动

mover:remove()